查看原文
其他

使用 Spring Boot 与 ip2region 联手打造高效 IP 白名单,性能爆表!

编程疏影 路条编程
2024-09-05


使用 Spring Boot 与 ip2region 联手打造高效 IP 白名单,性能爆表!

在当今互联网应用的开发中,IP 白名单功能是保障系统安全性和稳定性的重要手段之一。本文将详细介绍如何使用 Spring Boot 框架结合 ip2region 库来打造高效的 IP 白名单功能,并通过详细的代码示例和配置文件进行深入讲解。

ip2region 框架介绍与特性

ip2region 是一个高效的 IP 地址定位库,它具有以下显著特性:

  1. 高性能:能够快速地将 IP 地址转换为对应的地理区域信息,即使在处理大量 IP 数据时也能保持出色的性能。

  2. 数据精准:其数据来源准确可靠,能够提供精确的 IP 地址定位结果,有助于实现精准的区域控制和访问策略。

  3. 轻量级:框架本身占用资源少,易于集成到各种应用中,不会给系统带来过多的负担。

  4. 易于使用:提供了简单直观的接口和方法,方便开发者进行调用和集成。

以下是项目的完整 pom.xml 配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.10</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>ip-white-list</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>IPWhiteList</name>
<description>使用 Spring Boot + ip2region 实现的 IP 白名单功能</description>

<properties>
<java.version>11</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>ip2region</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

YAML 属性文件配置(application.yml)

# IP 白名单相关配置
ip-white-list:
enabled: true
ips:
- "127.0.0.1"
- "192.168.1.100"
# 其他相关配置项

后端代码实现

Ip2RegionUtil 类用于获取 IP 所在的地区信息:

import com.alibaba.druid.util.StringUtils;
import com.lionsoul.ip2region.xdb.Searcher;

import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;

public class Ip2RegionUtil {

private static final ConcurrentHashMap<String, Searcher> CACHE = new ConcurrentHashMap<>();

public static String getRegion(String ip) {
if (StringUtils.isEmpty(ip)) {
return "无效的 IP 地址";
}
String dbPath = "/yourPath/ip2region.xdb"; // 请替换为实际的 xdb 文件路径
Searcher searcher;
try {
if (CACHE.containsKey(dbPath)) {
searcher = CACHE.get(dbPath);
} else {
searcher = Searcher.newWithFileOnly(dbPath);
CACHE.put(dbPath, searcher);
}
return searcher.search(ip);
} catch (IOException e) {
e.printStackTrace();
return "查询失败";
}
}
}

合理利用缓存上述代码中的 Ip2RegionUtil 类中使用 ConcurrentHashMap  Searcher 对象进行合理利用缓存,减少重复创建对象的开销。

大家可以从以下地址获取 ip2region  xdb 文件(即 String dbPath = "/yourPath/ip2region.xdb"; 中所需的文件路径):https://github.com/lionsoul2014/ip2region/blob/master/data/ip2region.xdb,及时更新数据源:关注 ip2region 官方提供的数据更新,及时获取并替换最新的 xdb 文件,以保证数据的准确性。

IpWhiteListService 类用于判断 IP 是否在白名单中:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class IpWhiteListService {

@Value("${ip-white-list.ips}")
private List<String> whiteListIps;

public boolean isIpInWhiteList(String ip) {
// 使用 ip2region 获取 IP 所在地区信息
String region = Ip2RegionUtil.getRegion(ip);
// 根据地区或其他规则判断是否在白名单
return whiteListIps.contains(ip) && region.equals("特定地区");
}
}

IpWhiteListController 类提供了接口供前端调用:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class IpWhiteListController {

private final IpWhiteListService ipWhiteListService;

public IpWhiteListController(IpWhiteListService ipWhiteListService) {
this.ipWhiteListService = ipWhiteListService;
}

@GetMapping("/checkIp")
public boolean checkIp(@RequestParam String ip) {
return ipWhiteListService.isIpInWhiteList(ip);
}
}

前端页面实现

使用 Thymeleaf 模板和 JavaScript 实现前端页面:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>IP 白名单检查</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>
<body>
<h2>IP 白名单检查</h2>
<input type="text" id="ipInput">
<button onclick="checkIp()">检查</button>
<div id="result"></div>

<script>
function checkIp() {
var ip = $("#ipInput").val();
$.ajax({
url: '/checkIp?ip=' + ip,
type: 'GET',
success: function (data) {
if (data) {
$("#result").text("IP 在白名单中");
} else {
$("#result").text("IP 不在白名单中");
}
},
error: function () {
$("#result").text("请求出错");
}
});
}
</script>
</body>
</html>

总结

本文通过详细的代码示例和配置文件,展示了如何使用 Spring Boot 结合 ip2region 库打造高效的 IP 白名单功能。包括后端的服务类、控制器类以及前端的页面交互,为开发者提供了一个完整且可参考的实现方案。


今天就讲到这里,如果有问题需要咨询,大家可以直接留言或扫下方二维码来知识星球找我,我们会尽力为你解答。



作者:路条编程(转载请获本公众号授权,并注明作者与出处)
继续滑动看下一个
路条编程
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存